/**
 * TOKEN模型，当前主要返回jwt。
 */
const rs = require('randomstring');
const jwt = require('jsonwebtoken');
const helper = require('think-helper');

const JwtSecret = 'dLnije3C>8]358*s9t';

module.exports = class extends think.Model {
    /**
     * 创建一个access token。这个token仅在第一次请求API时使用，后续不再使用。
     */
    createAccessToken() {
        const data = {
            seed: rs.generate(20)
        };

        return jwt.sign(data, JwtSecret);
    }

    /**
     * @description 验证是否为accessToken票据
     *
     * @param {string} token 用户请求token
     */
    isAccessToken(token) {
        if (token) {
            try {
                let data = jwt.verify(token, JwtSecret);

                return !think.isEmpty(data.seed);
            } catch (err) {
                return false;
            }
        }

        return false;
    }

    /**
     * 创建安全访问Token。
     */
    async createSecureToken(userId, openid) {
        const obj = {
            userId: userId,
            openid: openid
        };

        return jwt.sign(obj, JwtSecret);
    }

    /**
     * @description 验证票据
     */
    verifyToken(token) {
        if (token) {
            try {
                let result = jwt.verify(token, JwtSecret);
                return !think.isEmpty(result);
            } catch (err) {
                return false;
            }
        }

        return false;
    }
};
